1. Field of the Invention
The present invention generally relates to data storage systems, and more particularly, to storage systems that store redundant data.
2. Description of the Related Art
Modern mass storage subsystems are used within computer networks to provide increasing storage capacities to fulfill user demands from host computer system applications. Unfortunately, access to the memory of the mass storage subsystems is slow, and as the sizes of the storage systems grow, access becomes even slower. A cost effective solution to this problem provides a cache between the host computer and the storage system. The primary purpose of a cache is to preserve data already in a primary cache that has not yet been committed to persistent memory. Caches are also used to temporarily store instructions or data that may be repeatedly accessed by a host, in order to increase the processing speed by avoiding the longer step of loading the instructions or data from the memory of the storage system. More specifically, the first time an instruction or data location is addressed, it must be accessed from the lower speed disk memory. Subsequent accesses to the same instruction or data are done via the faster cache memory, thereby minimizing access time and enhancing overall system performance. Typically, each cache is associated with a cache controller, which manages the transfer of data between the host and the cache memory.
With the increasing size of the mass storage subsystems, the reliance on such large mass storage subsystems also generates a need for enhanced reliability. Various system configurations and geometries are commonly applied to meet the demands for higher storage capacity while maintaining or enhancing reliability of the mass storage subsystems.
A popular solution to these demands for increased capacity and reliability in mass storage subsystems is the use of multiple storage modules configured in geometries that permit redundancy of stored data to assure data integrity in the case of system failures. Some of these systems in particular include redundant cache controllers. The primary purpose of such redundant cache controller systems is to preserve data already in a primary cache that has not yet been committed to persistent memory. Such data is referred to as “dirty data”. In some prior art systems including redundant cache controllers, a cache memory is shared by the redundant cache controllers, such that if one of the cache controllers fails, the redundant cache controller(s) maintains access to the cache memory and the data or instructions stored in the cache memory by the failed controller. Unfortunately, in such configurations, if the shared cache memory itself fails, any data or instructions stored in the failed cache memory would be lost.
In other systems including redundant cache controllers, each cache controller includes a dedicated cache memory. A significant challenge in such systems with redundant cache controllers is maintaining “cache coherency” without adversely affecting system performance. One solution to the problem of maintaining cache coherency is to maintain identical caches in each of the subsystems. In a first cache coherency maintenance solution, the entire cache may be periodically transmitted from the main cache to each of the remaining redundant cache(s). In a second cache coherency maintenance solution, each time a cache operation occurs for one cache, the redundant cache(s) is (are) notified of the operation and sent any corresponding data. As such, each of the redundant cache(s) is (are) updated. These two implementations have an obvious problem; during the periodic transmission of the cache data from the main cache to each of the remaining redundant cache(s), the redundant cache(s) is (are) not available for receiving any storage requests from a host, resulting in an increase of processing time. The first solution has additional problems. Firstly, the overhead associated with the data transmissions counteracts the benefits of having a cache. Secondly, the cache is not actually coherent at all times. That is, the data is vulnerable to loss during the sizeable period between transmissions.
Therefore it is apparent that a need exists in the art for a method and apparatus for preserving the dirty data of a failed redundant cache memory, which further reduces the overhead processing time of a data storage system and further increases system reliability.